package com.ruike.alisurface.utils;

import com.voodoo.lib_utils.L;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Author：voodoo
 * CreateTime：2021/01/25 025 01:36 下午
 * Description：CMD命令操作
 */
public class CmdUtils {

    /**
     * 安装Apk文件(静默安装)
     *
     * @param apkPath APK文件路径
     * @return 是否安装成功
     */
    public static boolean installApk(String apkPath) {
        String resultStr = execRootCmd("pm install -r -d " + apkPath);
        if (!resultStr.contains("Success")) {
            L.e(String.format("安装程序指令返回数据：%s", resultStr));
        }
        return resultStr.contains("Success");
    }

    /**
     * 卸载指定包名的Apk
     *
     * @param packageName 包名
     */
    public static boolean uninstall(String packageName) {
        String resultStr = execRootCmd("pm uninstall " + packageName);
        if (!resultStr.contains("Success")) {
            L.e(String.format("卸载程序指令返回数据：%s", resultStr));
        }
        return resultStr.contains("Success");
    }

    /**
     * 关机/重启
     *
     * @param isReboot 是否重启 false的话是关机
     */
    public static void reboot(boolean isReboot) {
        execRootCmd(isReboot ? "reboot" : "reboot -p");
    }

    /**
     * 获取安装的Apk包名
     *
     * @param isAllApkList 是否获取全部的安装包，true：获取全部的，false：只获取第三方的
     * @return 包名列表
     */
    public static String getInstallApkList(boolean isAllApkList) {
        return execRootCmd(isAllApkList ? "pm list package" : "pm list package -3");
    }

    /**
     * 获取最近任务列表，当前列表可判断是否运行，是否在前台
     *
     * @return 获取到的列表（包名）
     */
    public static List<String> getRecentTaskList() {
        String[] dumpsysActivities = execRootCmd("dumpsys activity").split("\n");
        List<String> recentTaskList = new ArrayList<>();
        for (String connect : dumpsysActivities) {
            if (connect.startsWith("  * Recent #")) {
//              * Recent #0: TaskRecord{c347c45 #383 A=com.voodoo.appdaemon U=0 StackId=1 sz=1} => {c347c45 #383 A=com.voodoo.appdaemon U=0 StackId=1 sz=1}
                String substring = connect.substring(connect.indexOf("{"));
                String[] split = substring.split(" ");
                recentTaskList.add(split[2].substring(2));
            }
        }
        L.i("运行中的程序列表", recentTaskList);
        return recentTaskList;
    }



    /**
     * 执行命令并且输出结果
     *
     * @param cmds 执行的指令集合，可变长度
     */
    public static String execRootCmd(String... cmds) {
        String result = "";
        DataOutputStream dos = null;
        DataInputStream dis = null;

        try {
            // 经过Root处理的android系统即有su命令
            Process p = Runtime.getRuntime().exec("su");
            dos = new DataOutputStream(p.getOutputStream());
            dis = new DataInputStream(p.getInputStream());

            for (String cmd : cmds) {
                L.i("执行的CMD指令：" + cmd);
                dos.writeBytes(cmd + "\n");
                dos.flush();
            }
            dos.writeBytes("exit\n");
            dos.flush();
            String line = null;
            while ((line = dis.readLine()) != null) {
                result += (line + "\n");
            }
            p.waitFor();
        } catch (Exception e) {
            L.e("指令执行异常：" + e.toString());
        } finally {
            try {
                if (dos != null) {
                    dos.close();
                }
                if (dis != null) {
                    dis.close();
                }
            } catch (IOException e) {
                L.e("流关闭异常：" + e.toString());
            }
        }
        return result;
    }



}